package com.dk.action;

import com.alibaba.fastjson.JSON;
import com.dk.domain.ActionEntity;
import com.dk.domain.action.ExtractParameterEntity;
import com.dk.domain.action.GetVarEntity;
import com.dk.domain.action.SqlActionBodyEntity;
import com.dk.enumerate.DkRuleEnum;
import com.dk.testcase.BaseCase;
import com.dk.util.config.ReadConfig;
import com.dk.util.jdbc.JdbcUtil;
import com.dk.util.log.Log;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * Sql查询实现策略
 */
public class SqlSelectHandler implements ActionStrategy{
    /**
     * 实现sql查询动作
     * @param actionEntity 动作实体
     */
    @Override
    public void Action(ActionEntity actionEntity) {
        //获取动作主体内容
        String actionBody = actionEntity.getActionBody();
        //获取需要提取的参数
        String extractParameter= actionEntity.getExtractParameter();
        //将动作主体内容转换为sql执行主体对象
        SqlActionBodyEntity sqlActionBodyEntity = JSON.parseObject(actionBody, SqlActionBodyEntity.class);
        //将提取参数内容转换为提取参数对象
        ExtractParameterEntity extractParameterEntity = JSON.parseObject(extractParameter, ExtractParameterEntity.class);

        //通过数据库名称获取到数据库信息
        Map<String,String> dbConfig = BaseCase.dbConfigMap.get(sqlActionBodyEntity.getDb());
        //获取jdbc连接对象
        Connection conn = JdbcUtil.getConnection(ReadConfig.JDBC_DRIVER,
                dbConfig.get(DkRuleEnum.DB_URL.getValue()),
                dbConfig.get(DkRuleEnum.DB_USER.getValue()),
                dbConfig.get(DkRuleEnum.DB_PWD.getValue()));
        Log.info("---【数据库查询】:开始执行查询操作，查询sql:"+sqlActionBodyEntity.getSql()+";");
        //执行sql查询获取查询结果
        List<Map<String,String>> resultList =  JdbcUtil.select(conn,sqlActionBodyEntity.getSql());
        //获取增加参数对象集合
        List<GetVarEntity> getVarList = extractParameterEntity.getGetVar();
        //遍历增加参数对象集合，获取需要的参数到公共参数集中
        getVarList.stream().forEach(getVar->{
            if(Integer.valueOf(getVar.getSub())<resultList.size()){
                Map<String,String> handle = resultList.get(Integer.valueOf(getVar.getSub()));
                BaseCase.varEntityMap.put(getVar.getSetKey(),handle.get(getVar.getGetValueInResult()));
                Log.info("---【数据库查询】:查询成功，增加依赖参数:"+getVar.getSetKey()+":"+handle.get(getVar.getGetValueInResult())+";");
            }else{
                Log.error("---【error】:数组越界，请检查提取参数的下标数据,ActionNum:"+actionEntity.getActionNum()+";");
            }

        });
        try {
            conn.close();
        } catch (SQLException e) {
            Log.error("---【error】关闭数据库连接异常,请检查数据,ActionNum:"+actionEntity.getActionNum());
            e.printStackTrace();
        }
    }

}
